package com.template.common.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;

import java.util.ArrayList;
import java.util.List;

/**
 * Bean工具类
 * 
 * @author template
 * @since 2024-01-01
 */
public class BeanUtil {

    /**
     * 对象属性拷贝
     * 
     * @param source 源对象
     * @param targetClass 目标类
     * @param <T> 泛型
     * @return 目标对象
     */
    public static <T> T copyProperties(Object source, Class<T> targetClass) {
        if (source == null) {
            return null;
        }
        return cn.hutool.core.bean.BeanUtil.copyProperties(source, targetClass);
    }

    /**
     * 对象属性拷贝（忽略null值）
     * 
     * @param source 源对象
     * @param target 目标对象
     */
    public static void copyPropertiesIgnoreNull(Object source, Object target) {
        if (source == null || target == null) {
            return;
        }
        cn.hutool.core.bean.BeanUtil.copyProperties(source, target, true);
    }

    /**
     * 对象属性拷贝（忽略指定属性）
     * 
     * @param source 源对象
     * @param target 目标对象
     * @param ignoreProperties 忽略的属性
     */
    public static void copyPropertiesIgnoreFields(Object source, Object target, String... ignoreProperties) {
        if (source == null || target == null) {
            return;
        }
        cn.hutool.core.bean.BeanUtil.copyProperties(source, target, ignoreProperties);
    }

    /**
     * 列表对象转换
     * 
     * @param sourceList 源列表
     * @param targetClass 目标类
     * @param <S> 源类型
     * @param <T> 目标类型
     * @return 目标列表
     */
    public static <S, T> List<T> copyList(List<S> sourceList, Class<T> targetClass) {
        if (CollUtil.isEmpty(sourceList)) {
            return new ArrayList<>();
        }
        
        List<T> targetList = new ArrayList<>();
        for (S source : sourceList) {
            T target = copyProperties(source, targetClass);
            if (target != null) {
                targetList.add(target);
            }
        }
        return targetList;
    }

    /**
     * 对象转Map
     * 
     * @param obj 对象
     * @return Map
     */
    public static java.util.Map<String, Object> toMap(Object obj) {
        if (obj == null) {
            return new java.util.HashMap<>();
        }
        return cn.hutool.core.bean.BeanUtil.beanToMap(obj);
    }

    /**
     * Map转对象
     * 
     * @param map Map
     * @param targetClass 目标类
     * @param <T> 泛型
     * @return 对象
     */
    public static <T> T mapToBean(java.util.Map<String, Object> map, Class<T> targetClass) {
        if (map == null || map.isEmpty()) {
            return null;
        }
        return cn.hutool.core.bean.BeanUtil.toBean(map, targetClass);
    }

    /**
     * 判断对象是否为空
     * 
     * @param obj 对象
     * @return 是否为空
     */
    public static boolean isEmpty(Object obj) {
        if (obj == null) {
            return true;
        }
        if (obj instanceof String) {
            return StrUtil.isEmpty((String) obj);
        }
        if (obj instanceof List) {
            return CollUtil.isEmpty((List<?>) obj);
        }
        if (obj instanceof java.util.Map) {
            return CollUtil.isEmpty((java.util.Map<?, ?>) obj);
        }
        return false;
    }

    /**
     * 判断对象是否不为空
     * 
     * @param obj 对象
     * @return 是否不为空
     */
    public static boolean isNotEmpty(Object obj) {
        return !isEmpty(obj);
    }
}
